/**
 * \file utils.c
 * \brief Des fonctions utiles utilisés en commun .
 * \author 
 * \version 0.12
 * \date 22 février 2011
 *
 * Implémentation des fonctions utiles utilisés en commun.
 *
 */
#include <msp430x14x.h>
#include "utils.h"

#include <io.h>
#include <signal.h>
#include <iomacros.h>

#define FRONT_MONTANT 0
#define FRONT_DESCENDANT 1

extern OS_EVENT *SemBus;
extern OS_EVENT *BipMbox;
extern OS_EVENT *ButtonMbox;

void delay (unsigned int a)
{
  int k;
  for (k=0 ; k != a; ++k)
  {
    _NOP();
    _NOP();
    _NOP();
    _NOP();
  }
}

void delayMinMaj(unsigned int minor, unsigned int major) {
  int i,j;
  for(j=0; j < major; j++)
    {
      for (i = 0; i<minor; i++) 
	   {
	     nop();
	     nop();
	   }
    }
}

void delayx100us(unsigned char b)
{
  int j;
  for (j=0; j!=b; ++j) 
  delay (_100us);
}

void getBus()
{
	INT8U err;
	OSMutexPend(SemBus, 0, &err);
}

void releaseBus()
{
	OSMutexPost(SemBus);
}

INT32U getPressedButton()
{
	if ((B1)==0) return 1;
	if ((B2)==0) return 2;
	if ((B3)==0) return 3;
	if ((B4)==0) return 4;
	return -1;
}

// Interruption de gestion des boutons
interrupt (PORT1_VECTOR) prvbutton( void )
{
	static INT32U temps=0;
	static int front= FRONT_MONTANT;
	static int bouton;
	LPM3_EXIT;
	P1IE=0x00;
	delayMinMaj(40,100);
	if (front == FRONT_MONTANT)
	{
		temps = OSTimeGet();
		P1IES = 0X01;  // detection sur front descendant
		front=FRONT_DESCENDANT;
		bouton=getPressedButton();
		OSMboxPost(BipMbox, DO_BIP);
	}
	else if (front == FRONT_DESCENDANT)
	{
		if ((OSTimeGet()-temps )> DELAY_100ms*5)  //temps d'appui inférieur à 1,5s
		{
			if ((bouton)==1) 
			bouton=COM_B1_LONG;
			if ((bouton)==2) 
			bouton=COM_B2_LONG;
			if ((bouton)==3) 
			bouton=COM_B3_LONG;
			if ((bouton)==4) 
			bouton=COM_B4_LONG;
		}
		else
		{
			OSMboxPost(BipMbox, CANCEL_BIP);
		}
		OSMboxPost(ButtonMbox, bouton);
		P1IES = 0xFF; // detection sur front montant
		front=FRONT_MONTANT;
	}
	P1IFG = 0x00; // effacer FLAG  IRQ
	P1IE  = 0xFF; // Autoriser IRQ
}
